Search


#單元測試的藝術2ndEdition #讀書心得

可以從一些靜態...

  • Share this:


#單元測試的藝術2ndEdition #讀書心得

可以從一些靜態分析數據來挑,哪一些測試好做跟有比較高的價值!

複雜度越高,代表幾件事:
1. 人腦不好判讀,也就容易寫錯,尤其是 condition branch 的部分,bool 一直都是口是心非最常出現的地方。

2. 複雜度高,也很容易是職責攪在一起的地方,職責攪在一起就代表,只要某個職責需求有所變化,這一段程式碼就會被影響到,進而需要進行修改與調整。而只要有異動和調整,就可能會把原本是對的,改成是錯的。所以為這建立測試程式,可以讓後續的回歸測試時間縮得更短。如果要改的就是這一大段複雜的方法,那為他撰寫好完整的測試程式,後續調整或維護的人員,就可以從測試案例的 scenario 瞭解這段程式碼究竟代表著什麼樣的需求與期待。需求要調整時,先從測試案例著手,而不是直接動手改 production code。

3. 複雜度高,如前面講的,通常不好維護、不好讀、職責攪在一起,因此也是重構的優先候選。要重構前,要先建立測試,才能確保程式碼不會因為重構的修改而導致執行結果不如預期。

外部依賴的部分,代表的是耦合性。耦合性越強,代表彈性越弱,代表越容易牽一髮動全身,代表單元測試的可測試性薄弱。因此:
1. 外部依賴越多,可測試性越低,撰寫單元測試程式的成本與時間越高。(重構解耦完才能撰寫 isolated unit test)
2. 若單元測試成本過高,且環境允許使用整合測試,那就適合直接使用整合測試。有了整合測試保護後,接著只要時間允許,需求需要,隨時可以對程式重構進行解耦,解耦完成就代表外部依賴減少了,自然撰寫 isolated unit test 的成本就降低了。

總結
整體投資報酬比依序是:複雜度高且外部依賴低 > 複雜度高且外部依賴高 > 複雜度低且外部依賴依 > 複雜度低且外部依賴高

上面是投資報酬比,但有個簡單的例外情況:線上出錯了的程式,優先順序最高。

最後,舉幾個例子:
1. 複雜度高、外部依賴低:很多純粹邏輯驗證的 validation 屬於這一類。例如統一編號/身份證字號的驗證、不需要太多外部依賴的商業邏輯驗證(例如毛利率要>n%, 訂單金額不可以小於0、某些長度不可以過長、編碼規則驗證等等)

這類 case 很容易出錯,但其實測試成本極低。

2. 複雜度高、外部依賴高:business/domain layer 的物件居多。重點在於職責怎麼切分,接著才是有哪一些是值得解耦的。(完全介面導向+DI的設計,是有點 over design 但不失為一個簡單的 policy)

3. 複雜度低、外部依賴高:如果是正常的,那大概就是一些 pattern 的中間層產物,例如 adpater、model mapping、proxy 類型的。這類即使不寫測試,造成的影響不大,原因是當其他該寫測試的都寫了,一旦 runtime 執行出錯,馬上就可以找到問題可能就在這些中介層或外部依賴。

另外一類正常的,就是貧血的 Dao 物件,不帶商業邏輯,但會與外部資料來源相依,例如外部的 web service, database, file 等 persistance 資源。這類型因為往往不帶邏輯,而對需求來說,想驗證的也是 to end 的 result,所以撰寫整合測試的價值優於單元測試。

4. 複雜度低、外部依賴低:這....好像比較常出現在非 public/internal 的 function,就讓 public 的 test cases 去 cover 即可。如果這樣的方法也是 public 的,有時間就幫他寫測試,沒時間的話,因為他沒啥邏輯,出錯的機率低,可以等到需求異動時再來補測試案例即可。(當然,如果你是TDD,根本就不會有這些問題)


Tags:

About author
我是 Joey Chen,闖蕩江湖的稱號是 91,熱血點火師,專門燃起大家心裡面的熱情與初衷。 目前為 Odd-e Taiwan 的負責人,同時也是 JetBrains 在台灣的培訓夥伴,至今也仍是熱愛學習與享受各種程式語言之美的 programmer。 身為敏捷教練,擅長 Agile、Scrum、LeSS 等敏捷文化與協作框架的落實與導入,如何讓大家 being agile 而不是 doing agile。同時喜歡結合各家所長,例如 Lean, Kanban 等,重點是持續改善、解決問題、端出成果,而不執著於某種特定方法論或框架。 身為技術教練,我也是極限編程(extreme programming)的狂熱者,我擅長用這些技術與工程實踐來提昇產品的品質、團隊的生產力、降低營運風險,因應市場與公司的商業目標,讓團隊能具有高適應與反應能力的基礎建設。例如 實例化需求、ATDD、BDD、TDD、重構、自動化單元測試/整合測試/驗收測試、CI/CD、code review、pair programming、mob-programming 等等。 同時,我也是推崇 極速開發 的 developer,追求從想法到產品程式碼的完成,中間的時間差能趨近於零,也就是劍隨心轉,想到哪,程式碼就長到哪的境界。從想法到實現中間的等待,其實在實務上佔了很大的 context switch 成本,如果能讓這段時間縮到最短,就能比其他人多嘗試更多種解決方案,進而挑選出最剛好的方案。 同時也是技術社群的活躍份子,從 2010 年開始連任九屆的微軟 MVP,兼任 MSDN 論壇板主,也曾經獲得年度 MSDN 文件庫刊登數量世界第一的榮耀。對微軟技術有愛,對 C# 有愛,對自動測試有愛,對重構與設計模式有愛。近年來對 Java, PHP, Python 也充滿濃厚的興趣,曾帶領客戶團隊中不會寫程式的 QA ,一起用 Python 完成超過百個 mobile UI 自動化測試。 擁有超過十年擔任開發團隊 tech leader, trainer, coach 與 mentor 的經驗,進行的企業內部與公開技術培訓課程已超過 100 場,培訓過的開發人員超過 1000 位,擔任研討會與社群活動的講師次數超過 30 次。 同時也是技術書籍的作者與譯者,與朋友合著的書籍包含《ASP.NET MVC 5:網站開發美學》、《ASP.NET MVC 4 網站開發美學》,翻譯的書籍有《單元測試的藝術-第二版》、《敏捷開發實踐》、《進入IT產業必讀的200個 .NET面試決勝題》。 如果想跟我即時互動,歡迎直接私訊或 email 至 [email protected]
請參考:https://tdd.best/about/
View all posts